home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
progtool
/
modula2
/
module
/
kbdevnt.mod
< prev
next >
Wrap
Text File
|
1995-11-25
|
5KB
|
167 lines
IMPLEMENTATION MODULE KbdEvnt;
FROM SYSTEM IMPORT VAL,ADDRESS,SHIFT,WORD,ADR,TSIZE;
FROM Strings IMPORT RightStr,EqualStr,Length,ClearStr,Concat,IsEmptyStr;
FROM ConvertStr IMPORT IntToStr;
FROM XBIOS104 IMPORT KeyTable,SetKeyTable, KeyTablePtr,KeyTrans,KeyTransPtr;
FROM Chars IMPORT CAPGerman;
FROM GEMAESbase IMPORT Disabled,MenuSelected,
Object,GraphicString,GraphicTitle;
FROM AES IMPORT ApplWrite;
FROM EasyDialog IMPORT and,WorkTree,TreePROC;
VAR
laenge,ID : INTEGER;
MessageBuffer : ARRAY [0..7] OF INTEGER;
found : BOOLEAN;
MenuString,
ScanString : ARRAY [0..7] OF CHAR;
AsciiValue : CHAR;
PROCEDURE SearchMenuTree(MenuTree:ADDRESS; Index :INTEGER);
VAR
MenuObject : POINTER TO Object;
s : POINTER TO ARRAY [0..40] OF CHAR;
OK : BOOLEAN;
BEGIN
s:=ADR(MenuString);
MenuObject:=MenuTree+ VAL(ADDRESS,(Index*TSIZE(Object)));
IF (MenuObject^.type=GraphicString) AND ~and(MenuObject^.state,Disabled) THEN
s:=MenuObject^.spec;
END(*IF*);
RightStr(s^,laenge,MenuString,OK);
IF EqualStr(ScanString,MenuString)THEN
MessageBuffer[0]:=MenuSelected;
MessageBuffer[1]:=ID;
MessageBuffer[2]:=0;
MessageBuffer[3]:=3;
MessageBuffer[4]:=Index;
ApplWrite(ID,16,ADR(MessageBuffer));
found:=TRUE
END(*IF*);
END SearchMenuTree;
PROCEDURE ConcatScanString(VAR ScanString : ARRAY OF CHAR;KeyState,
Key :INTEGER);
VAR pKeyTable :KeyTablePtr;
pKeyTa,KbdUnshift,KbdShift,KbdCapslock: KeyTransPtr;
CASsing : ARRAY [1..1] OF CHAR;
CharStr : ARRAY [1..1] OF CHAR;
OK : BOOLEAN;
scan : INTEGER;
chr : CHAR;
CONST
KSHIFT =3;(* Linke und/oder rechte Shifttaste*)
KALT =8;(* Alternate Taste*)
KCTRL =4;(* Control Taste*)
BEGIN
scan:=SHIFT(Key,-8);
ScanString:=0C;
(************ Tastaturtabelle holen**************************)
pKeyTa:=VAL(ADDRESS,-1);
pKeyTable:=SetKeyTable( pKeyTa, pKeyTa, pKeyTa);
KbdUnshift:=pKeyTable^.unshift;
KbdShift:=pKeyTable^.shift;
KbdCapslock:=pKeyTable^.capslock;
(************* Scancode der Tastaturbelegung zuordnen*************)
IF ~and(KeyState,KSHIFT) THEN
chr:=CHR(VAL(INTEGER,KbdUnshift^[scan]));
chr:=CAPGerman(chr);
ScanString[0]:=' ';
ELSE
chr:=CHR(VAL(INTEGER,KbdShift^[scan]));
ScanString[0]:=CHR(1);
END(*IF*);
CharStr[1]:=chr;
AsciiValue:=chr;
(***************** Zeichen für Shift, ctrl und alternate setzen******)
IF and(KeyState,KALT) THEN
CASsing[1]:=CHR(7);
Concat(ScanString,CASsing,ScanString,OK);
END(*IF*);
IF and(KeyState,KCTRL) THEN
Concat(ScanString,'^',ScanString,OK);
END(*IF*);
(******************** Buchstaben oder Funktionstasten anfügen*********)
Concat(ScanString,CharStr,ScanString,OK);
CASE scan OF
062H :
Concat(ScanString,'HELP',ScanString,OK);
|061H :
Concat(ScanString,'UNDO',ScanString,OK);
|01H :
Concat(ScanString,'ESC',ScanString,OK);
|0EH :
Concat(ScanString,'BSPC',ScanString,OK);
|053H :
Concat(ScanString,'DEL',ScanString,OK);
|0FH :
Concat(ScanString,'TAB',ScanString,OK);
|052H :
Concat(ScanString,'INS',ScanString,OK);
|047H :
Concat(ScanString,'HOME',ScanString,OK);
|03BH,054H :
Concat(ScanString,'F1',ScanString,OK);
|03CH,055H :
Concat(ScanString,'F2',ScanString,OK);
|03DH,056H :
Concat(ScanString,'F3',ScanString,OK);
|03EH,057H :
Concat(ScanString,'F4',ScanString,OK);
|03FH,058H :
Concat(ScanString,'F5',ScanString,OK);
|040H,059H :
Concat(ScanString,'F6',ScanString,OK);
|041H,05AH :
Concat(ScanString,'F7',ScanString,OK);
|042H,05BH :
Concat(ScanString,'F8',ScanString,OK);
|043H,05CH :
Concat(ScanString,'F9',ScanString,OK);
|044H,05DH :
Concat(ScanString,'F10',ScanString,OK);
ELSE
END;(*CASE*)
END ConcatScanString;
PROCEDURE MenuSearch(AppID:INTEGER; MenuTree:ADDRESS;KeyState,Key:INTEGER;
VAR Taste:CHAR):BOOLEAN;
VAR
scan,state :INTEGER;
chr :CHAR;
CharStr : ARRAY [0..0] OF CHAR;
LastObj,i :CARDINAL;
search :TreePROC;
BEGIN
i:=0;
ID:=AppID;
LastObj:=0;
ClearStr(MenuString);
ClearStr(ScanString);
MenuString:=' ';
ScanString:=' ';
found:=FALSE;
search:=SearchMenuTree;
ConcatScanString(ScanString,KeyState,Key);
Taste:=AsciiValue;
laenge:=Length(ScanString);
IF IsEmptyStr(ScanString) THEN
RETURN FALSE;
END(*IF*);
WorkTree(MenuTree,0,0,search);
RETURN found;
END MenuSearch;
END KbdEvnt.